home *** CD-ROM | disk | FTP | other *** search
/ Classic Games for OS/2 Warp / Classic Games for OS2 Warp (1995)(IBM).iso / rapdata / digmid.asm < prev    next >
Assembly Source File  |  1995-06-22  |  8KB  |  482 lines

  1.  
  2.  
  3.     .386
  4.     .model small
  5.     option oldstructs
  6.  
  7.     include d:\cw\cw.inc
  8.     include d:\cw\cw-undoc.inc
  9.  
  10.     include mdv.inc
  11.  
  12. b    equ    byte ptr
  13. w    equ    word ptr
  14. d    equ    dword ptr
  15. f    equ    fword ptr
  16.  
  17.  
  18.     .code
  19.  
  20.  
  21. ;-------------------------------------------------------------------------------
  22. ;
  23. ;Load and initialise DigPak and MidPak drivers.
  24. ;
  25. ;On Entry:
  26. ;
  27. ;nothing.
  28. ;
  29. ;On Exit:
  30. ;
  31. ;Carry set on error and AX=error code.
  32. ;
  33. ;Error codes:
  34. ;
  35. ;0    - no error.
  36. ;1    - file not found.
  37. ;2    - not enough memory.
  38. ;3    - corrupt driver file.
  39. ;
  40. ;Note:
  41. ;
  42. ;All of the other routines can be called after this routine has failed to
  43. ;initialise the drivers. This code sets a flag which is checked by the other
  44. ;routines which will simply exit without doing anything if the drivers arn't
  45. ;loaded.
  46. ;
  47. InitDigMid    proc    near
  48.     public InitDigMid
  49.     cmp    HaveDigMid,0        ;Check if we already loaded the
  50.     jnz    @@8        ;drivers.
  51. ;
  52. ;Load the relavent driver files.
  53. ;
  54.     sys    cwGetPatch
  55.     cmp    d[edx+4],0
  56.     jz    @@GetDig
  57.     mov    edx,[edx+4]
  58.     mov    sDriverAddr,edx
  59.     jmp    @@GotDig
  60. @@GetDig:    ;
  61.     mov    edx,offset DigName    ;DigPak selected driver name,
  62.     sys    cwLoad
  63.     jc    @@9
  64.     mov    sDriverAddr,edx
  65.     mov    w[sDriverAddr+4],si
  66.     mov    edi,sDriverAddr
  67.     call    MDV_Init[edi]    ;Call init code.
  68.     jc    @@9        ;oops, some kind of problem.
  69. @@GotDig:    ;
  70.     sys    cwGetPatch
  71.     cmp    d[edx],0
  72.     jz    @@GetMid
  73.     mov    edx,[edx]
  74.     mov    mDriverAddr,edx
  75.     jmp    @@GotMid
  76. @@GetMid:    ;
  77.     mov    edx,offset MidName    ;MidPak selected driver name.
  78.     sys    cwLoad
  79.     jc    @@9
  80.     mov    mDriverAddr,edx
  81.     mov    w[mDriverAddr+4],si
  82.     mov    edi,mDriverAddr
  83.     mov    eax,50
  84.     call    MDV_Init[edi]    ;Call init code.
  85.     jc    @@9        ;oops, some kind of problem.
  86. @@GotMid:    ;
  87. @@8:    mov    HaveDigMid,1        ;flag driver present.
  88.     xor    ax,ax
  89.     ret
  90.     ;
  91. @@9:    push    ax        ;save error code.
  92.     call    RemDigMid        ;Remove everything on error.
  93.     pop    ax
  94.     stc
  95.     ret
  96. InitDigMid    endp
  97.  
  98.  
  99. ;-------------------------------------------------------------------------------
  100. ;
  101. ;Remove DigPak and MidPak drivers.
  102. ;
  103. RemDigMid    proc    near
  104.     public RemDigMid
  105. ;
  106. ;Make sure no Midi stuff playing.
  107. ;
  108.     call    StopDigi
  109.     call    StopMidi
  110.     call    RemDigiFile
  111.     call    RemMidiFile
  112. ;
  113. ;Need to de-init MidPak if it was initialised.
  114. ;
  115.     cmp    w[mDriverAddr+4],0    ;Did we make the init call?
  116.     jz    @@0
  117.     mov    edi,mDriverAddr
  118.     call    MDV_Rem[edi]        ;Call remove code.
  119.     xor    bx,bx
  120.     xchg    bx,w[mDriverAddr+4]
  121.     sys    RelMem
  122. ;
  123. ;Now release memory allocated for all MidPak chunks.
  124. ;
  125. @@0:    xor    bx,bx
  126.     xchg    bx,MidiFileSeg
  127.     or    bx,bx
  128.     jz    @@3
  129.     sys    RelMem
  130. ;
  131. ;Need to de-init DigPak if it was initialised.
  132. ;
  133. @@3:    cmp    w[sDriverAddr+4],0    ;Did we make the init call?
  134.     jz    @@4
  135.     mov    edi,sDriverAddr
  136.     call    MDV_Rem[edi]        ;Call remove code.
  137.     xor    bx,bx
  138.     xchg    bx,w[sDriverAddr+4]
  139.     sys    RelMem
  140.     ;
  141. @@4:    mov    HaveDigMid,0
  142.     ret
  143. RemDigMid    endp
  144.  
  145.  
  146. ;-------------------------------------------------------------------------------
  147. ;
  148. ;Load and register a midi file.
  149. ;
  150. ;On Entry:
  151. ;
  152. ;DS:DX    - file name.
  153. ;
  154. ;On Exit:
  155. ;
  156. ;Carry set on error and AX=error code else,
  157. ;
  158. ;nothing.
  159. ;
  160. ;Error Codes:
  161. ;
  162. ;0    - no error.
  163. ;1    - file not found.
  164. ;2    - not enough memory.
  165. ;3    - MidPak driver not loaded.
  166. ;
  167. InitMidiFile    proc    near
  168.     public InitMidiFile
  169.     mov    ax,3
  170.     cmp    HaveDigMid,1        ;check drivers are loaded.
  171.     jc    @@9
  172.     ;
  173.     call    RemMidiFile        ;lose anything already loaded.
  174.     call    LoadAllocate        ;load requested file.
  175.     jc    @@9
  176.     mov    MidiFileSeg,dx    ;stow this for release.
  177.     or    MIDIUsed,-1
  178.     ;
  179.     xor    ax,ax
  180. @@9:    ret
  181. InitMidiFile    endp
  182.  
  183.  
  184. ;-------------------------------------------------------------------------------
  185. ;
  186. ;Load and register a digi file.
  187. ;
  188. ;On Entry:
  189. ;
  190. ;DS:DX    - file name.
  191. ;
  192. ;On Exit:
  193. ;
  194. ;Carry set on error and AX=error code else,
  195. ;
  196. ;nothing.
  197. ;
  198. ;Error Codes:
  199. ;
  200. ;0    - no error.
  201. ;1    - file not found.
  202. ;2    - not enough memory.
  203. ;3    - DigPak driver not loaded.
  204. ;
  205. InitDigiFile    proc    near
  206.     public InitDigiFile
  207.     mov    ax,3
  208.     cmp    HaveDigMid,1        ;check drivers are loaded.
  209.     jc    @@9
  210.     ;
  211.     call    RemDigiFile
  212.     call    LoadAllocate        ;load requested file.
  213.     jc    @@9
  214.     mov    DigiFileSeg,dx    ;stow this for release.
  215.     ;
  216.     xor    ax,ax
  217. @@9:    ret
  218. InitDigiFile    endp
  219.  
  220.  
  221. ;-------------------------------------------------------------------------------
  222. ;
  223. ;Make sure no midi stuff is playing and release memory used by current file.
  224. ;
  225. RemMidiFile    proc    near
  226.     public RemMidiFile
  227.     pushad
  228.     xor    bx,bx
  229.     xchg    bx,MidiFileSeg    ;check if a previous allocation
  230.     or    bx,bx        ;needs releaseing.
  231.     jz    @@0
  232.     call    StopMidi
  233.     sys    RelMem        ;release memory.
  234. @@0:    popad
  235.     ret
  236. RemMidiFile    endp
  237.  
  238.  
  239. ;-------------------------------------------------------------------------------
  240. ;
  241. ;Make sure no digi stuff is playing and release memory used by current file.
  242. ;
  243. RemDigiFile    proc    near
  244.     public RemDigiFile
  245.     pushad
  246.     xor    dx,dx
  247.     xchg    dx,DigiFileSeg
  248.     or    dx,dx
  249.     jz    @@0
  250.     call    StopDigi
  251.     mov    bx,dx
  252.     sys    RelMem
  253. @@0:    popad
  254.     ret
  255. RemDigiFile    endp
  256.  
  257.  
  258. ;-------------------------------------------------------------------------------
  259. ;
  260. ;Start X-Midi sequence playing.
  261. ;
  262. ;On Entry:
  263. ;
  264. ;AX    - Sequence number.
  265. ;
  266. PlayMidi    proc    near
  267.     public PlayMidi
  268.     cmp    HaveDigMid,1
  269.     jc    @@9
  270.     or    MIDIUsed,-1
  271.     call    StopMidi
  272.     push    eax
  273.     push    esi
  274.     push    edx
  275.     push    ecx
  276.     push    ebx
  277.     mov    bx,MidiFileSeg
  278.     sys    GetSelDet32
  279.     mov    esi,edx
  280.     pop    ebx
  281.     pop    ecx
  282.     pop    edx
  283.     mov    eax,1
  284.     mov    edi,mDriverAddr
  285.     call    MDV_Play[edi]    ;Play tune.
  286.     pop    esi
  287.     pop    eax
  288.     clc
  289. @@9:    ret
  290. PlayMidi    endp
  291.  
  292.  
  293. ;-------------------------------------------------------------------------------
  294. ;
  295. ;Update Midi player.
  296. ;
  297. UpdateMidi    proc    near
  298.     public UpdateMidi
  299.     cmp    HaveDigMid,1
  300.     jc    @@9
  301.     push    edi
  302.     mov    edi,mDriverAddr
  303.     call    MDV_Update[edi]    ;Update tune.
  304.     pop    edi
  305. @@9:    ret
  306. UpdateMidi    endp
  307.  
  308.  
  309. ;-------------------------------------------------------------------------------
  310. ;
  311. ;Start a digi sample playing.
  312. ;
  313. ;On Entry:
  314. ;
  315. ;AX    - Sample number.
  316. ;
  317. PlayDigi    proc    near
  318.     public PlayDigi
  319.     pushad
  320.     cmp    HaveDigMid,1
  321.     jc    @@9
  322.     ;
  323.     movzx    edi,ax
  324.     shl    edi,2
  325.     add    edi,4
  326.     ;
  327.     push    es
  328.     mov    es,DigiFileSeg
  329.     mov    esi,es:[edi]
  330.     mov    ecx,es:[edi]
  331.     and    ecx,0FFFFFFh
  332.     sub    ecx,2
  333.     add    esi,5
  334.     push    eax
  335.     push    ebx
  336.     push    ecx
  337.     push    edx
  338.     mov    bx,es
  339.     sys    GetSelDet32
  340.     add    esi,edx
  341.     pop    edx
  342.     pop    ecx
  343.     pop    ebx
  344.     pop    eax
  345.     mov    edi,sDriverAddr
  346.     call    MDV_Play[edi]    ;Play sample.
  347.     pop    es
  348.     ;
  349. @@9:    popad
  350. @@return:    ret
  351. PlayDigi    endp
  352.  
  353.  
  354. ;-------------------------------------------------------------------------------
  355. ;
  356. ;Stop any midi sounds that are playing.
  357. ;
  358. StopMidi    proc    near
  359.     public StopMidi
  360.     cmp    HaveDigMid,1
  361.     jc    @@9
  362.     cmp    MIDIUsed,0
  363.     jz    @@9
  364.     push    edi
  365.     mov    edi,mDriverAddr
  366.     call    MDV_Stop[edi]    ;Update tune.
  367.     pop    edi
  368. @@9:    ret
  369. StopMidi    endp
  370.  
  371.  
  372. ;-------------------------------------------------------------------------------
  373. ;
  374. ;Stop any digi sounds that are playing.
  375. ;
  376. StopDigi    proc    near
  377.     public StopDigi
  378.     cmp    HaveDigMid,1
  379.     jc    @@9
  380.     push    edi
  381.     mov    edi,sDriverAddr
  382.     call    MDV_Stop[edi]    ;Update tune.
  383.     pop    edi
  384. @@9:    ret
  385. StopDigi    endp
  386.  
  387.  
  388. ;-------------------------------------------------------------------------------
  389. ;
  390. ;Allocate memory for, and load, specified file.
  391. ;
  392. ;On Entry:
  393. ;
  394. ;DS:DX    - File name.
  395. ;
  396. ;On Exit:
  397. ;
  398. ;Carry set on error and AX=error code else,
  399. ;
  400. ;DX    - Selector for memory file loaded to.
  401. ;SI    - low word length.
  402. ;DI    - high word length.
  403. ;
  404. ;Error codes:
  405. ;
  406. ;0    - no error.
  407. ;1    - file not found.
  408. ;2    - not enough memory.
  409. ;
  410. ;All other registers preserved.
  411. ;
  412. LoadAllocate    proc    near
  413.     mov    ax,3d00h
  414.     int    21h
  415.     mov    bx,ax
  416.     jc    @@10
  417.     xor    cx,cx
  418.     xor    dx,dx
  419.     mov    ax,4202h
  420.     int    21h
  421.     shl    edx,16
  422.     mov    dx,ax
  423.     push    edx
  424.     xor    cx,cx
  425.     xor    dx,dx
  426.     mov    ax,4200h
  427.     int    21h
  428.     pop    ecx
  429.     push    bx
  430.     sys    GetMem32
  431.     mov    ax,bx
  432.     pop    bx
  433.     jc    @@9
  434.     push    ax
  435.     push    ds
  436.     mov    ds,ax
  437.     xor    edx,edx
  438. @@read:    or    cx,-1
  439.     mov    ah,3fh        ;Read the driver into memory.
  440.     int    21h
  441.     jc    @@readover
  442.     movzx    eax,ax
  443.     add    edx,eax
  444.     or    eax,eax
  445.     jnz    @@read
  446.     clc
  447. @@readover:    pop    ds
  448.     pop    dx
  449.     jc    @@9
  450.     push    dx
  451.     mov    ah,3eh        ;close the file.
  452.     int    21h
  453.     pop    dx
  454.     clc
  455.     ret
  456.     ;
  457. @@9:    mov    ah,3eh        ;close the file.
  458.     int    21h
  459. @@10:    stc
  460.     ret
  461. LoadAllocate    endp
  462.  
  463.  
  464.     .data
  465.  
  466.     public HaveDigMid, sDriverAddr, mDriverAddr, MIDIUsed
  467.  
  468. HaveDigMid    db 0
  469. ;
  470. sDriverAddr    dd 0,0
  471. DigiFileSeg    dw 0
  472. DigName    db